//
//  main.m
//  OC03_属性_点语法
//
//  Created by Scott on 16/2/26.
//  Copyright © 2016年 Scott. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Fraction.h"

int main(int argc, const char * argv[]) {

#pragma mark - 知识点1. 属性
/** 
 * 属性实现了三个功能: 1. 声明了一个实例变量.
                    2. 声明了setter, getter方法.
                    3. 实现了setter, getter方法.
 *
 * 详见Person 类文件.
 */
    
#if 0
    // 创建person对象.
    Person *per = [Person person];
    
    // 实例变量赋值, setter方法是属性自动实现的.
    [per setName:@"Tom"];
    [per setSex:@"male"];
    [per setAge:20];
    
    // 实例变量取值, getter方法是属性自动实现的.
    NSLog(@"name:%@, sex:%@, age:%ld", [per name], [per sex], [per age]);
    
    
    Person *per2 = [[Person alloc] initWithName:@"Lisi" sex:@"femail" age:18];
#endif
    
#pragma mark - 知识点2. 属性的特性
/** 
 * 属性的特性有3个: 读写性, 原子性, 语义设置.
 * 属性的特性的目的是: 控制setter, getter方法实现的细节.
 *
 * 读写性特性的选项: readonly, readwrite, setter= , getter=.
                   默认是 readwrite.
                   常用是 readwrite.
 *
 * 原子性特性的选项: atomic, nonatomic.
                   默认是 atomic.
                   常用是 nonatomic.
 
 * 语义设置特性的选项: assign, retain, copy
                   默认是 assign.
                   非对象类型(int, NSIntger)使用 assign.
                   对象类型(NSString) 使用 retain.
                   对象类型并且想获取副本 使用 copy.
 *
 * 详见 Person.h 文件.
 */
    
#pragma mark - 知识点3. 点语法
/** 
 * 点语法只适用于 setter, getter方法.
 */
    
    // 创建对象.
    Person *per1 = [Person person];
    
    // 点语法对属性进行赋值.
    per1.name = @"Tom";
    per1.sex = @"male";
    per1.age = 20;
    
    // 点语法对属性取值.
    NSLog(@"name:%@, sex:%@, age:%ld", per1.name, per1.sex, per1.age);
    
    
    Person *per2 = [Person person];
    
    per2.name = per1.name;
    
    
    
    
#pragma mark - 综合练习(分数)
    /**
     * 定义一个Fraction类(分数)实现分数的加减乘除, ⽐较⼤小、约分等方法。
     * 提示：
     * 1.声明属性 numerator(分子)、denominator(分母)。
     * 2.声明自定义初始化方法、遍历构造器，用于给分子分母赋值。
     * 3.声明功能方法(6个功能).
     */

    // 创建分数对象.
    Fraction *frac1 = [Fraction fractionWithNumerator:2 denominator:3];
    
    
    Fraction *frac2 = [Fraction fractionWithNumerator:1 denominator:2];
    
    
    // 调用加方法.
    Fraction *frac3 = [frac1 plusWithFraction:frac2];
    
    NSLog(@"sum:%@", frac3);
    NSLog(@"sum = %ld/%ld", frac3.numerator, frac3.denominator);

    
    
    
    
    
    
    
    
    
    
    
    
    return 0;
}
